【STM32】SPI通讯控制ILI9341显示屏 | 您所在的位置:网站首页 › esp32 ili9341触摸屏 › 【STM32】SPI通讯控制ILI9341显示屏 |
简介
ILI9341是一款分辨率为240x320 分辨率的a- tft液晶显示单片SOC驱动,由720通道源驱动、320通道门驱动、172800字节GRAM (240RGBx320点位图形显示数据)和电源电路组成。 ILI9341支持并行8-/9-/16-/18位数据总线MCU接口,6-/16-/18位数据总线RGB接口和3 /4线串行外围接口SPI通讯。通过窗口地址函数可以在内部GRAM中指定运动图像的区域。指定的窗口区域可以有选择地更新,使移动的图片 系统框图ILI9341提供了四种单片机系统接口, 其中8080- /8080Ⅰ-Ⅱ系列并行接口和3 - 4线串行接口。 给定接口的选择由外部IM[3:0]引脚完成,如下所示: IM3IM2IM1IM0MCU-Interface ModeRegister/ContentGRAM00008080-8bit–ID[7:0]D[7:0],WRX,RDX,CSX,D/CX00018080-16bit–ID[7:0]D[15:0],WRX,RDX,CSX,D/CX00108080-9bit–ID[7:0]D[8:0],WRX,RDX,CSX,D/CX00118080-18bit–ID[7:0]D[17:0],WRX,RDX,CSX,D/CX IM3IM2IM1IM0MCU-Interface ModePins in use01013-write 9bit serial interface ISCL,SDA,CSX01104-write 8bit serial interface ISCL,SDA,CSX,D/C IM3IM2IM1IM0MCU-Interface ModeRegister/ContentGRAM10008080-16bit–IID[8:1]D[17:10],D[8:1],WRX,RDX,CSX,D/CX10018080-8bit–IID[17:10]D[17:10],WRX,RDX,CSX,D/CX10108080-18bit–IID[8:1]D[17:0],WRX,RDX,CSX,D/CX10118080-9bit–IID[17:10]D[17:9],WRX,RDX,CSX,D/CX IM3IM2IM1IM0MCU-Interface ModePins in use11013-write 9bit serial interface ISCL,SDI,SDO,CSX11104-write 8bit serial interface ISCL,SDI,SDO,CSX,D/C注意: 在8080-Ⅰ/8080-Ⅱ串并联接口中,寄存器由D[17:0]数据引脚访问。 3线串行模式由芯片使能输入(CSX),串行时钟输入(SCL)和串行数据输入/输出(SDA或SDI/SDO)组成。 4线串行模式包括数据/命令选择输入(D/CX),芯片使能输入(CSX),串行时钟输入(SCL)和串行数据输入/输出(SDA或SDI/SDO)进行数据传输。 未使用的数据总线(D[17:0])必须连接到GND。串行时钟(SCL)仅用于与MCU的接口 写入数据/命令接口的写模式是指主机向ILI9341写入命令或数据。3线/3 PIN 串行数据包包含一个数据/命令选择位(D/CX)和一个传输字节。如果D/CX位为“low”,则传输字节被解释为命令字节。如果D/CX位为“高”,则传输字节存储为显示数据RAM(内存写命令),或命令寄存器作为参数。 3线串行通讯 缩写含义SCL时钟线SDA数据线CSX芯片输入使能
ILI9341有两种RGB接口,这两种接口可以通过RCM[1:0]位进行选择。当RCM[1:0]位设置为“10”时,DE模式被选择,使用VSYNC, HSYNC, DOTCLK, DE, D[17:0]引脚;当RCM[1:0]位设置为“11”,选择同步模式,使用垂直同步,高度同步,DOTCLK, D [17:0] pin。使用RGB接口时必须选择串行接口。 水平同步(HSYNC)用于告知何时接收到帧的新行。这是低使能,它的状态是通过DOTCLK信号的上升边缘读取到显示模块。 在DE模式下,数据启用(DE)用来告诉何时有接收到的RGB信息应该在显示器上传输。这是一个高使能,它的状态通过DOTCLK信号的上升边缘读取到显示模块。D[17:0]是用来告诉在显示器上传输的图像的信息是什么(当DE= ’ 0 ‘(低),DOTCLK有上升边)。D[17:0]可以是’ 0 ‘(低)或’ 1 '(高)。这些行由DOTCLK信号的上升边读取。 在SYNC模式下,根据HSYNC信号的HFP/HBP设置和VSYNC的VFP/VBP设置,通过D[17:0]以像素单位输入的有效显示数据。在两种RGB接口模式下,输入显示数据先写入GRAM,然后根据GRAM的灰色数据输出相应的源电压。 指令表内容 1.一级指令说明:Description of Level 1 Command 1. 空指令(00h)此命令为空命令;对显示模块没有任何影响。但是它可以用来终止帧内存写或读在RAMWR(内存写)和RAMRD(内存读)命令中描述。 当软件复位命令被写入时,它会导致软件复位。它将命令和参数重置为它们的 S/W重置默认值。(参见每个命令描述中的默认表。) 注意:帧内存内容不受此命令影响;X =不在乎。 这个读字节返回24位显示标识信息。 第1个参数是虚拟数据。 第2个参数(ID1 [7:0]): LCD模块的制造商ID。 第3个参数(ID2 [7:0]): LCD模块/驱动版本ID。 第4个参数(ID3 [7:0]): LCD模块/驱动ID。 ![]() ![]()
![]() …其余的值列表参照芯片手册。 代码部分 配置GPIO引脚模式初始化控制引脚创建SPI模拟时序发送SPI数据关联LCD 写数据、写命令拓展16bit数据发送初始化LCD设置点设置GUI具体代码如下: #include "ili9341.h" #include "delay.h" /**************************************************************************** * 名 称 :void Lcd_Init(void) * 功 能 :初始化液晶屏幕 * 入口参数:void * 出口参数:void * 说 明 :液晶初始化_ILI9225_176X220 * 作 者 :koko ****************************************************************************/ void Lcd_Init(void) { LCD_SPI_GPIO_Init(); Lcd_Reset(); Lcd_WriteIndex(0x11); //休眠指令 LCD_WriteData(0x00); //0x0000 0000 Lcd_WriteIndex(0xCF); //电源控制 LCD_WriteData(0X00); //0x0000 0000 LCD_WriteData(0XC1); //0x1100 0001 开启节电操作 LCD_WriteData(0X30); //0x0011 0000 防静电保护 Lcd_WriteIndex(0xED); //开机顺序控制 LCD_WriteData(0X54); //0x0101 0100 软启动保持两帧 。内置帧缓存器是否可用 /启用内置帧缓存 LCD_WriteData(0X03); // LCD_WriteData(0X12); // LCD_WriteData(0X81); //使能DDVDH_ENH Lcd_WriteIndex(0xE8); //驱动器定时控制A LCD_WriteData(0X85); //NOW LCD_WriteData(0X11); //门驱动不重叠定时控制 ,CR振荡器定时控制 LCD_WriteData(0X78); //不使用pre-charge定时控制 Lcd_WriteIndex(0xF6); //显示接口设定 LCD_WriteData(0X01); //记忆写控制 LCD_WriteData(0X30); //EPR设定 11 模式 LCD_WriteData(0X00); //选择显示数据的传输方式 Lcd_WriteIndex(0xCB); //电压控制设定 LCD_WriteData(0X39); //默认 LCD_WriteData(0X2C); //默认 LCD_WriteData(0X00); //默认 LCD_WriteData(0X34); //默认 LCD_WriteData(0X05); //DDVDH 设定为5.3 Lcd_WriteIndex(0xF7); //泵比控制 LCD_WriteData(0X20); //DDVDH=3xVCI Lcd_WriteIndex(0xEA); //驱动器定时控制B LCD_WriteData(0X00); //门驱动时序控制 0UNIT LCD_WriteData(0X00); //默认 Lcd_WriteIndex(0xC0); //功率控制1 LCD_WriteData(0X20); //设置GVDD电平,该电平是VCOM电平和灰度电压电平的参考电平 设置禁止 Lcd_WriteIndex(0xC1); //功率控制2 LCD_WriteData(0X11); //设置在升压电路中使用的因子。 为工作电压选择最佳的升压系数。为了降低功耗,请设置较小的因数。 Lcd_WriteIndex(0xC5); //Vcom 控制1 LCD_WriteData(0X31); //默认值 LCD_WriteData(0X3C); //默认值 Lcd_WriteIndex(0xC7); //Vcom 控制2 LCD_WriteData(0XA9); //开机复位后,nVM等于“0”,VCOM偏移等于程序MTP值。当nVM设置为“1”时,VMF[6:0]的设置生效,VCOMH/VCOML可以调整。 Lcd_WriteIndex(0x3A); //像素格式集 LCD_WriteData(0X55); //16bit色 Lcd_WriteIndex(0x36); //存储器存取控制 #if USE_HORIZONTAL LCD_WriteData(0xE8);//横屏参数 #else LCD_WriteData(0x48);//竖屏参数 #endif Lcd_WriteIndex(0xB1); //帧比率控制 /控制 /帧率控制 /帧速率控制 LCD_WriteData(0X00); //默认值 LCD_WriteData(0X18); //RTNA[4:0]用于在MCU接口上设置Normal模式1H(线)周期。 设定为禁止 Lcd_WriteIndex(0xB4); //显示反转控制 LCD_WriteData(0X00); LCD_WriteData(0X00); Lcd_WriteIndex(0xF2); //使能3G LCD_WriteData(0X02); //不使用3G控制 Lcd_WriteIndex(0x26); //伽马设定 LCD_WriteData(0X01); //默认值 Lcd_WriteIndex(0xE0); //积极的伽马校正 LCD_WriteData(0X0F); LCD_WriteData(0X17); LCD_WriteData(0X14); LCD_WriteData(0X09); LCD_WriteData(0X0C); LCD_WriteData(0X06); LCD_WriteData(0X43); LCD_WriteData(0X75); LCD_WriteData(0X36); LCD_WriteData(0X08); LCD_WriteData(0X13); LCD_WriteData(0X05); LCD_WriteData(0X10); LCD_WriteData(0X0B); LCD_WriteData(0X08); Lcd_WriteIndex(0xE1); //负面的伽马矫正 LCD_WriteData(0X00); LCD_WriteData(0X1F); LCD_WriteData(0X23); LCD_WriteData(0X03); LCD_WriteData(0X0E); LCD_WriteData(0X04); LCD_WriteData(0X39); LCD_WriteData(0X25); LCD_WriteData(0X4D); LCD_WriteData(0X06); LCD_WriteData(0X0D); LCD_WriteData(0X0B); LCD_WriteData(0X33); LCD_WriteData(0X37); LCD_WriteData(0X0F); Lcd_WriteIndex(0x29); //开显示 } /************************************************* 函数名:LCD_Set_XY 功能:设置lcd显示起始点 入口参数:xy坐标 返回值:无 *************************************************/ void Lcd_SetXY(u16 Xpos, u16 Ypos) { Lcd_WriteIndex(0x2A); //列地址设定 LCD_WriteData_16Bit(Xpos); //列地址内容 Lcd_WriteIndex(0x2B); //页地址设定 LCD_WriteData_16Bit(Ypos); //页地址内容 Lcd_WriteIndex(0x2c); //内存写入 } /************************************************* 函数名:LCD_Set_Region 功能:设置lcd显示区域,在此区域写点数据自动换行 入口参数:xy起点和终点 返回值:无 *************************************************/ //设置显示窗口 void Lcd_SetRegion(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd) { Lcd_WriteIndex(0x2A); //列地址设定 LCD_WriteData_16Bit(xStar); //x起点 LCD_WriteData_16Bit(xEnd); //x重点 Lcd_WriteIndex(0x2B); //页地址设定 LCD_WriteData_16Bit(yStar); //页的起点 LCD_WriteData_16Bit(yEnd); //页的终点 Lcd_WriteIndex(0x2c); //内存写入 } /**************************************************************************** * 名 称 :void LCD_Color_Fill(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd,u16 color) * 功 能 :填充一个模块使用一个颜色 * 入口参数:u16 xStar, u16 yStar,u16 xEnd,u16 yEnd,u16 color * 出口参数:void * 说 明 :void * 作 者 :koko ****************************************************************************/ void LCD_Color_Fill(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd,u16 color) { int i,j; Lcd_SetRegion(xStar,yStar,xEnd,yEnd); for(i = 0; i LCD_WriteData_16Bit(color); } } } /************************************************* 函数名:LCD_DrawPoint 功能:画一个点 入口参数:xy坐标和颜色数据 返回值:无 *************************************************/ void Gui_DrawPoint(u16 x,u16 y,u16 Data) { Lcd_SetXY(x,y); //描点 LCD_WriteData_16Bit(Data); //画点内容 } /************************************************* 函数名:Lcd_Clear 功能:全屏清屏函数 入口参数:填充颜色COLOR 返回值:无 *************************************************/ void Lcd_Clear(u16 Color) { unsigned int i; Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1); LCD_CS_CLR; LCD_RST_SET; for(i=0;i |
CopyRight 2018-2019 实验室设备网 版权所有 |